//package util;
//
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.ObjectInputStream;
//import java.io.ObjectOutputStream;
//import java.util.Collection;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import redis.clients.jedis.Jedis;
//import redis.clients.jedis.JedisPubSub;
//import redis.clients.jedis.ShardedJedis;
//import redis.clients.jedis.ShardedJedisPool;
//import redis.clients.jedis.Transaction;
//import redis.clients.jedis.TransactionBlock;
//
//public class ShardedJedisOperations implements JedisOperations {
//	
//	private ShardedJedisPool pool;
//	
//	public ShardedJedisOperations(ShardedJedisPool pool){
//		this.pool = pool;
//	}
//	
//	@Override
//	public Long del(String... keys) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			long count = 0;
//			for (String key : keys) {
//				count += jedis.del(key);
//			}
//			return count;
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//		
//	}
//	
//	@Override
//	public String type(String key){
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.type(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> keys(String pattern) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			Jedis jedisA = jedis.getShard(pattern);
//			return jedisA.keys(pattern);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long ttl(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.ttl(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Boolean exists(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.exists(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long expire(String key, int seconds) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.expire(key, seconds);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long persist(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			Collection<Jedis> clients = jedis.getAllShards();
//			Long count = 0L;
//			Iterator<Jedis> ite = clients.iterator();
//			while(ite.hasNext()){
//				Jedis j = ite.next();
//				count = j.persist(key);
//			}
//			return count;
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String set(String key, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.set(key, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long setnx(String key, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.setnx(key, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String setex(String key, int seconds, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.setex(key, seconds, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String get(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.get(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long incr(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.incr(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long incrBy(String key, long increase) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.incrBy(key, increase);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long decr(String key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.decr(key);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long decrBy(String key, long decrease) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.decrBy(key, decrease);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long hset(String hkey, String field, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hset(hkey, field, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long hsetnx(String hkey, String field, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hsetnx(hkey, field, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String hmset(String hkey, Map<String, String> hash) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hmset(hkey, hash);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String hget(String hkey, String field) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hget(hkey, field);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Map<String, String> hgetAll(String hkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hgetAll(hkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long hdel(String hkey, String field) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hdel(hkey, field);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long hlen(String hkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hlen(hkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Boolean hexists(String hkey, String field) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hexists(hkey, field);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long hincrBy(String hkey, String field, long increase) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hincrBy(hkey, field, increase);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> hkeys(String hkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hkeys(hkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public List<String> hvals(String hkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.hvals(hkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long lpush(String lkey, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.lpush(lkey, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long rpush(String lkey, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.rpush(lkey, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String lpop(String lkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.lpop(lkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String rpop(String lkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.rpop(lkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long llen(String lkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.llen(lkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public List<String> lrange(String lkey, int start, int end) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.lrange(lkey, start, end);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long lrem(String lkey, int count, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.lrem(lkey, count, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String lset(String lkey, long index, String value) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.lset(lkey, index, value);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long sadd(String skey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.sadd(skey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long srem(String skey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.srem(skey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> smembers(String skey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.smembers(skey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Boolean sismember(String skey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.sismember(skey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long scard(String skey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.scard(skey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public String spop(String skey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.spop(skey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> sinter(String... skeys) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			Jedis jedisA = jedis.getAllShards().iterator().next();
//			return jedisA.sinter(skeys);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> sunion(String... skeys) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			Jedis jedisA = jedis.getAllShards().iterator().next();
//			return jedisA.sunion(skeys);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> sdiff(String... skeys) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			Jedis jedisA = jedis.getAllShards().iterator().next();
//			return jedisA.sdiff(skeys);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zadd(String zkey, double score, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zadd(zkey, score, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zrem(String zkey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrem(zkey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zcard(String zkey) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zcard(zkey);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zcount(String zkey, double min, double max) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zcount(zkey, min, max);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Double zscore(String zkey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zscore(zkey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Double zincrby(String zkey, double score, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zincrby(zkey, score, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> zrange(String zkey, int start, int end) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrange(zkey, start, end);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Set<String> zrevrange(String zkey, int start, int end) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrevrange(zkey, start, end);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//	
//	@Override
//	public Set<String> zrangeByScore(String zkey, double min, double max){
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrangeByScore(zkey, min, max);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//	
//	@Override
//	public Set<String> zrangeByScore(String zkey, String min, String max){
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrangeByScore(zkey, min, max);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zrank(String zkey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrank(zkey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public Long zrevrank(String zkey, String member) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zrevrank(zkey, member);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//	
//	@Override
//	public Long zremrangeByScore(String zkey, double start, double end){
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zremrangeByScore(zkey, start, end);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//	
//	@Override
//	public Long zremrangeByScore(String zkey, String start, String end){
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.zremrangeByScore(zkey, start, end);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//	
//	@Override
//	public List<Object> multiResult(TransactionBlock block){
//		return null;
//	}
//	
//	@Override
//	public Transaction multi(){
//		return null;
//	}
//	
//	@Override
//	public Long publish(String channel, String message) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.getShard(channel).publish(channel, message);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public void subscribe(JedisPubSub pubSub, String... channels) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			jedis.getShard(channels[0]).subscribe(pubSub, channels);
//		}finally{
//			if(jedis != null){
//				pool.returnResource(jedis);
//			}
//		}
//	}
//
//	@Override
//	public byte[] serializable(Object obj){
//		if (obj == null) return null;
//
//		ObjectOutputStream oos = null;
//		ByteArrayOutputStream baos = null;
//		
//		try {
//			baos = new ByteArrayOutputStream();
//			oos = new ObjectOutputStream(baos);
//			oos.writeObject(obj);
//			
//			return baos.toByteArray();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}finally{
//			try {
//				if(null != oos)oos.close();
//				if(null != baos)baos.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//		
//		return null;
//	}
//
//	@Override
//	public Object unserialize(byte[] bytes) {
//		if (bytes == null) return null;
//
//		ByteArrayInputStream bais = null;
//		
//		try {
//			bais = new ByteArrayInputStream(bytes);
//			ObjectInputStream ois = new ObjectInputStream(bais);
//			
//			return ois.readObject();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}finally{
//			try {
//				if(null != bais)bais.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//		}
//		
//		return null;
//	}
//
//	@Override
//	public void set(byte[] key, byte[] value, int exp) {
//		ShardedJedis  jedis = null;
//		
//		try {
//			jedis = pool.getResource();
//
//			if (exp > 0)
//				jedis.setex(key, exp, value);
//			else
//				jedis.set(key, value);
//		}catch (Exception e) {
//			e.printStackTrace();
//		}finally {
//			if (jedis != null) pool.returnResource(jedis);
//		}
//	}
//
//	@Override
//	public byte[] get(byte[] key) {
//		ShardedJedis  jedis = null;
//		
//		try {
//			jedis = pool.getResource();
//			
//			return jedis.get(key);
//		}catch (Exception e) {
//			e.printStackTrace();
//		}finally {
//			if (jedis != null) pool.returnResource(jedis);
//		}
//		
//		return null;
//	}
//	
//	@Override
//	public long del(byte[] key) {
//		ShardedJedis jedis = null;
//		try{
//			jedis = pool.getResource();
//			return jedis.del(key);
//		}catch (Exception e) {
//			e.printStackTrace();
//		}finally {
//			if(jedis != null) pool.returnResource(jedis);
//		}
//		
//		return -1;
//	}
//}
